package com.yry.timertask.chapter31;


import org.junit.jupiter.api.Test;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Timer;

public class MyTimer {

	/*1、在时间等于或超过time的时候执行且仅执行一次
	 *  如在2016-11-11 00：00:00执行一次task:打印任务的名称。
	 * */
	@Test
	public void scheduleFunc1(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("No.1");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("1-START====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		localDateTime = localDateTime.plusSeconds(3L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		myTimerTask.setName("schedule1");
		timer.schedule(myTimerTask,Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()));
		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("任务最后一次执行的时间：myTimerTask.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}

	/*2、在时间等于或超过time的时候执行task
	 *  之后每隔period毫秒重复执行一次task
	 *  如在2016-11-11 00：00:00执行一次task:打印任务的名称。
	 *  之后每隔2S执行一次task
	 * */
	@Test
	public void scheduleFunc2(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("No.1");
		myTimerTask.setName("schedule2");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("2 START exec time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
		localDateTime = localDateTime.plusSeconds(3L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		timer.schedule(myTimerTask,Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()),2000L);
		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("任务最后一次执行的时间：myTimerTask.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}

	/*3、等待delay毫秒后，执行且仅执行一次task
	 * 如在2016-11-11 00：00:00
	 * 则在2016-11-11 00：00:01执行一次task:打印任务的名字
	 *
	 * */
	@Test
	public void scheduleFunc3(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("No.1");
		myTimerTask.setName("schedule3");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("3-START exec time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
		localDateTime = localDateTime.plusSeconds(10L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );
		timer.schedule(myTimerTask,10*1000L);

		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("任务最后一次执行的时间：myTimerTask.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}
	/*4、等待delay毫秒后，首次task
	 * 之后每隔period毫秒重复执行一次task
	 * 如在2016-11-11 00：00:00
	 * 则在2016-11-11 00：00:05执行一次task:打印任务的名字
	 * 之后每隔2S执行一次task
	 * */
	@Test
	public void scheduleFunc4(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("No.1");
		myTimerTask.setName("schedule4");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("4-START exec time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
		localDateTime = localDateTime.plusSeconds(5L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		timer.schedule(myTimerTask,5000L,2000L);
		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("任务最后一次执行的时间：myTimerTask.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}
	/*1、在时间等于或超过time的时候执行task
	 *  之后每隔period毫秒重复执行一次task
	 *  如在2016-11-11 00：00:00执行一次task:打印任务的名称。
	 *  之后每隔2S执行一次task
	 * */
	@Test
	public void scheduleAtFunc1(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("scheduleAtFixedRate1");
//		myTimerTask.setName("scheduleAtFixedRate1");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("1-START exec time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
		localDateTime = localDateTime.plusSeconds(5L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		timer.scheduleAtFixedRate(myTimerTask,Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()),2000L);
		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("任务最后一次执行的时间：myTimerTask4.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}
	/*2、等待delay毫秒后，首次task
	 * 之后每隔period毫秒重复执行一次task
	 * 如在2016-11-11 00：00:00
	 * 则在2016-11-11 00：00:05执行一次task:打印任务的名字
	 * 之后每隔2S执行一次task
	 * */
	@Test
	public void scheduleAtFunc2(){
		//1、创建一个timer实例
		Timer timer = new Timer();
//		 2、创建一个MyTimerTask实例
		MyTimerTask myTimerTask = new MyTimerTask("scheduleAtFixedRate2");
		LocalDateTime localDateTime = LocalDateTime.now();
		System.out.println("2-START exec time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
		localDateTime = localDateTime.plusSeconds(5L);
		System.out.println("except EXEC====== time is:"+ localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) );

		timer.scheduleAtFixedRate(myTimerTask,5000L,2000L);
		try {
			Thread.sleep(30*1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.out.println("任务最后一次执行的时间：myTimerTask.scheduledExecutionTime():::"+ LocalDateTime.ofInstant(Instant.ofEpochMilli(myTimerTask.scheduledExecutionTime()), ZoneId.systemDefault()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

	}
 }
